package com.wzdigit.wms.wms.config.executor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 线程池配置
 * 
 * @author Administrator
 *
 */
@Configuration
@EnableAsync
public class ExecutorConfig {

	/**
	 * TODO:
	 * 此方法名称为asyncPromiseExecutor，即在spring中注入了一个名字为asyncPromiseExecutor的bean
	 * 方法名只要在项目中唯一性，可以适当任意取（最好遵循一定的规则）
	 * 使用方法：在需要加入线程池的方法上增加注解@Async("asyncPromiseExecutor")就可以加入此线程池异步执行
	 */
	@Bean
	public Executor asyncPromiseExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		// 配置核心线程数
		executor.setCorePoolSize(5);
		// 配置队列大小
		executor.setQueueCapacity(16);
		// 配置最大线程数
		executor.setMaxPoolSize(8);
		
		// 配置线程池中的线程的名称前缀
		executor.setThreadNamePrefix("Wms-Thread-");

		/**
		 * 当要创建的线程数量大于线程池的最大线程数的时候执行
		 * AbortPolicy：默认策略，直接抛出异常
		 * DiscardPolicy：不会抛异常也不会执行
		 * CallerRunsPolicy：调用当前线程池的所在的线程去执行被拒绝的任务
		 * DiscardOldestPolicy：会抛弃任务队列中最旧的任务也就是最先加入队列的，再把这个新任务添加进去
		 */
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		// 初始化执行器
		executor.initialize();
		return executor;
	}
}
